﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using netDxf;
using System.Collections;
using System.Drawing;
using System.Windows.Forms;
using netDxf.Blocks;
using netDxf.Collections;
using netDxf.Entities;
using netDxf.Header;
using netDxf.Objects;
using netDxf.Tables;
using netDxf.Units;

namespace FDXF
{
   public class LoadEntities
    {
        public DxfDocument dxfLoad;//定义DXF文件
        public List<float> ExDXF_X = new List<float>(); //定义图形的最大和最小X值的数组
        public List<float> ExDXF_Y = new List<float>(); //定义图形的最大和最小Y值的数组
        public float ZoomFactor; //DXF图形缩放因子
        public float MoveCenterX; //因平移图形后，使得图形的左下角和窗体的左下角在同一点上，但图形按比例缩放后，图形不在窗体X轴的中心，故设置此变量，用于计算图形距离窗体X轴方向上中心的距离
        public float MoveCenterY; //因平移图形后，使得图形的左下角和窗体的左下角在同一点上，但图形按比例缩放后，图形不在窗体Y轴的中心，故设置此变量，用于计算图形距离窗体Y轴方向上中心的距离
        public float MoveZeroX;       //dxf图形在X轴方向移动到原点的距离
        public float MoveZeroY;       //dxf图形在Y轴方向移动到原点的距离

        public int line_count;//定义直线的数量
        public int circle_count;//定义圆的数量
        public int arc_count;//定义圆弧的数量
        public int lwline_count;//定义多段线的数量

        //以下为定义dxf图形中，各个对象(直线、圆、圆弧等)集合的数组；
        public List<float> linePointStartX = new List<float>(); //定义直线起点的X值的数组
        public List<float> linePointStartY = new List<float>(); //定义直线起点的Y值的数组
        public List<float> linePointEndX = new List<float>(); //定义直线终点的X值的数组
        public List<float> linePointEndY = new List<float>(); //定义直线终点的X值的数组
        public List<int> lineColorR = new List<int>(); //定义直线颜色R值的数组
        public List<int> lineColorG = new List<int>(); //定义直线颜色G值的数组
        public List<int> lineColorB = new List<int>(); //定义直线颜色B值的数组


        public List<float> CircleCenterStartX = new List<float>(); //定义圆心的X值的数组
        public List<float> CircleCenterStartY = new List<float>(); //定义圆心的Y值的数组
        public List<float> CircleRadius = new List<float>(); //定义圆半径的数组
        public List<int> CircleColorR = new List<int>(); //定义圆的颜色R值的数组
        public List<int> CircleColorG = new List<int>(); //定义圆的颜色G值的数组
        public List<int> CircleColorB = new List<int>(); //定义圆的颜色B值的数组


        public List<float> ArcCenterStartX = new List<float>(); //定义圆弧圆心的X值的数组
        public List<float> ArcCenterStartY = new List<float>(); //定义圆弧圆心的Y值的数组
        public List<float> ArcRadius = new List<float>(); //定义圆弧半径的数组
        public List<float> ArcStartAngle = new List<float>(); //定义圆弧起点角度的数组
        public List<float> ArcEndAngle = new List<float>(); //定义圆弧终点角度的数组
        public List<int> ArcColorR = new List<int>(); //定义圆弧的颜色R值的数组
        public List<int> ArcColorG = new List<int>(); //定义圆弧的颜色G值的数组
        public List<int> ArcColorB = new List<int>(); //定义圆弧的颜色B值的数组


        //public List<List<float>> LWlineElevation= new List< List<float>>(); //定义多段线起点的X值的数组
        public List<float> LWlinePointStartX = new List<float>(); //定义多段线起点的Y值的数组
        public List<float> LWlinePointStartY = new List<float>(); //定义多段线起点的Y值的数组
        public List<float> LWlinePointEndX = new List<float>(); //定义多段线终点的X值的数组
        public List<float> LWlinePointEndY = new List<float>(); //定义多段线终点的X值的数组
        public List<float> LWlineWidth = new List<float>(); //定义多段线终点的X值的数组

        public List<int> LWlineColorR = new List<int>(); //定义多段线颜色R值的数组
        public List<int> LWlineColorG = new List<int>(); //定义多段线颜色G值的数组
        public List<int> LWlineColorB = new List<int>(); //定义多段线颜色B值的数组



        //以下为加载dxf文件，FileName为文件的路径
        public void GetFilename(string FileName)
        {
            DxfDocument dxf = new DxfDocument(); //实例化netDxf中的类DxfDocument
            dxfLoad = DxfDocument.Load(FileName);  //实例化netDxf中的DxfDocument.load，并且带入实参
        }

        public  void Getline() //获取dxf文件中所有直线的坐标
        {        
            //DxfDocument dxf = new DxfDocument(); //实例化netDxf中的DxfDocument
           // DxfDocument dxfLoad = DxfDocument.Load(FileName);  //实例化netDxf中的DxfDocument.load，并且带入实参
           // ArrayList lineListX = new ArrayList(); //定义动态数组 lineListX

            line_count = dxfLoad.Lines.Count(); //获取dxf文件中所有直线坐标的数量                                 
            foreach (netDxf.Entities.Line ln in dxfLoad.Lines) //遍历DXF文件中的直线
            {
                linePointStartX.Add(Convert.ToSingle(ln.StartPoint.X));   //直线起点的X值加入上面定义的数组中,同时数据类型转为float
                linePointStartY.Add(Convert.ToSingle(ln.StartPoint.Y));  //直线起点的Y值加入上面定义的数组中,同时数据类型转为float
                linePointEndX.Add(Convert.ToSingle(ln.EndPoint.X));     //直线终点的X值加入上面定义的数组中,同时数据类型转为float
                linePointEndY.Add(Convert.ToSingle(ln.EndPoint.Y));    //直线终点的Y值加入上面定义的数组中,同时数据类型转为float  
                lineColorR.Add(Convert.ToInt32(ln.Color.R));         //直线颜色的R值加入上面定义的数组中,同时数据类型转为Int  
                lineColorG.Add(Convert.ToInt32(ln.Color.G));         //直线颜色的R值加入上面定义的数组中,同时数据类型转为Int  
                lineColorB.Add(Convert.ToInt32(ln.Color.B));         //直线颜色的R值加入上面定义的数组中,同时数据类型转为Int  

            }

        }

        public void GetCircle() //获取dxf文件中所有的圆的坐标
        {
            circle_count = dxfLoad.Circles.Count(); //获取dxf文件中所有圆的数量  
            foreach (netDxf.Entities.Circle ln in dxfLoad.Circles) //遍历DXF文件中的圆
            {
                CircleCenterStartX.Add(Convert.ToSingle(ln.Center.X));   //圆心起点的X值加入上面定义的数组中,同时数据类型转为float
                CircleCenterStartY.Add(Convert.ToSingle(ln.Center.Y));  //圆心起点的Y值加入上面定义的数组中,同时数据类型转为float
                CircleRadius.Add(Convert.ToSingle(ln.Radius));     //圆半径的值加入上面定义的数组中,同时数据类型转为float     
                CircleColorR.Add(Convert.ToInt32(ln.Color.R));         //圆的颜色的R值加入上面定义的数组中,同时数据类型转为Int  
                CircleColorG.Add(Convert.ToInt32(ln.Color.G));         //圆的颜色的R值加入上面定义的数组中,同时数据类型转为Int  
                CircleColorB.Add(Convert.ToInt32(ln.Color.B));         //圆的颜色的R值加入上面定义的数组中,同时数据类型转为Int  

            }
        }

        public void GetArc() //获取dxf文件中所有的圆弧的坐标
        {
            arc_count = dxfLoad.Arcs.Count(); //获取dxf文件中所有圆弧的数量 
            foreach (netDxf.Entities.Arc ln in dxfLoad.Arcs) //遍历DXF文件中的圆弧
            {
                ArcCenterStartX.Add(Convert.ToSingle(ln.Center.X));   //圆弧圆心起点的X值加入上面定义的数组中,同时数据类型转为float
                ArcCenterStartY.Add(Convert.ToSingle(ln.Center.Y));  //圆弧圆心起点的Y值加入上面定义的数组中,同时数据类型转为float
                ArcRadius.Add(Convert.ToSingle(ln.Radius));     //圆弧半径的值加入上面定义的数组中,同时数据类型转为float  
                ArcStartAngle.Add(Convert.ToSingle(ln.StartAngle));     //圆弧起点角度的值加入上面定义的数组中,同时数据类型转为float
                ArcEndAngle.Add(Convert.ToSingle(ln.EndAngle));     //圆弧终点角度的值加入上面定义的数组中,同时数据类型转为float 
                ArcColorR.Add(Convert.ToInt32(ln.Color.R));         //圆弧的颜色的R值加入上面定义的数组中,同时数据类型转为Int  
                ArcColorG.Add(Convert.ToInt32(ln.Color.G));         //圆弧的颜色的R值加入上面定义的数组中,同时数据类型转为Int  
                ArcColorB.Add(Convert.ToInt32(ln.Color.B));         //圆弧的颜色的R值加入上面定义的数组中,同时数据类型转为Int  

            }
        }

        public void GetLWline() //获取dxf文件中所有直线的坐标
        {
            lwline_count = dxfLoad.LwPolylines.Count(); //获取dxf文件中所有直线坐标的数量   

            // netdxf定义多段线的坐标【包括起点和终点】都在Vertexes中，Vertexes为数组变量Vertexes{x,y}
            // 因foreach是以多段线的总数量作为遍历的次数，而1条多段线有2对坐标，都包含在Vertexes中，安此顺序排列{(StartX1,StartY1),(EndX1,EndY1)；(StartX2,StartY2),(EndX2,EndY2)...}，
            // Vertexes数组中，序号为：0，2，4，6...为多段线的【StartX】坐标和【StartY】坐标；
            // Vertexes数组中，序号为：1，3，5，7...为多段线的【EndX】坐标和【EndY】坐标，故Vertexes[]的序号的对应关系如下：
            // Vertexes[0].Position.X=“多段线顶点1的x坐标”,即 LWlinePointStartX
            // Vertexes[0].Position.Y=“多段线顶点1的Y坐标”,即 LWlinePointStartY
            // Vertexes[1].Position.X=“多段线顶点2的x坐标”,即 LWlinePointEndX
            // Vertexes[1].Position.Y=“多段线顶点2的Y坐标”,即 LWlinePointEndY

            foreach (netDxf.Entities.LwPolyline ln in dxfLoad.LwPolylines) //遍历DXF文件中的多段线
            {

                LWlinePointStartX.Add(Convert.ToSingle(ln.Vertexes[0].Position.X));   //多段线起点的X值加入上面定义的数组中,同时数据类型转为float
                LWlinePointStartY.Add(Convert.ToSingle(ln.Vertexes[0].Position.Y));   //多段线起点的Y值加入上面定义的数组中,同时数据类型转为float

                LWlinePointEndX.Add(Convert.ToSingle(ln.Vertexes[1].Position.X));   //多段线终点的X值加入上面定义的数组中,同时数据类型转为float
                LWlinePointEndY.Add(Convert.ToSingle(ln.Vertexes[1].Position.Y));   //多段线终点的Y值加入上面定义的数组中,同时数据类型转为float

                LWlineWidth.Add(Convert.ToSingle(ln.Vertexes[0].StartWidth));      //netdxf中无全局宽度，故仅列出了起始宽度。

                LWlineColorR.Add(Convert.ToInt32(ln.Color.R));         //直线颜色的R值加入上面定义的数组中,同时数据类型转为Int  
                LWlineColorG.Add(Convert.ToInt32(ln.Color.G));         //直线颜色的R值加入上面定义的数组中,同时数据类型转为Int  
                LWlineColorB.Add(Convert.ToInt32(ln.Color.B));         //直线颜色的R值加入上面定义的数组中,同时数据类型转为Int 

            }

            //MessageBox.Show(LWlinePointEndX[0].ToString());  //26.5
            //MessageBox.Show(LWlinePointEndY[0].ToString());    //83.9
        }



        //以下为计算dxf图形在X方向移动到原点的距离
        //以下为计算dxf图形在Y方向移动到原点的距离
        //通过移动dxf图形使图形的左下角和原点重合
        public void MoveZero(PictureBox Picture)  //第一步，移动dxf图形左下角坐标移动至原点，移动的变量为【MoveZeroX，MoveZeroY】
        {

            //以下为计算图形X方向移动到原点的距离
            //通过移动图形使图形的左下角和原点重合
            if (ExDXF_X.Min() <= 0) //如果直线X轴的最小值为负或零时
            {
                MoveZeroX = Math.Abs(ExDXF_X.Min()); //移动的数值

            }
            else
            {
                MoveZeroX = -ExDXF_X.Min(); //移动的数值

            }

            //以下为计算图形Y方向移动到原点的距离
            //通过移动图形使图形的左下角和原点重合
            if (ExDXF_Y.Min() <= 0) //如果直线Y轴的最小值为负或零时
            {
                //MoveY = Math.Abs(ExLineY.Min())- Math.Abs(DrawingHeight / 2); //移动的数值
                MoveZeroY = Math.Abs(ExDXF_Y.Min()); //移动的数值

            }
            else
            {
                //MoveY = -ExLineY.Min()+ Math.Abs(DrawingHeight/2); //移动的数值
                MoveZeroY = -ExDXF_Y.Min(); //移动的数值
            }

        }

        //为了计算出图形显示的矩形长度，所以要计算出所有点X轴坐标的最大和最小值；
        //为了计算出图形显示的矩形高度，所以要计算出所有点Y轴坐标的最大和最小值；
        //计算出X轴的最大和最小值后，图形在X轴的长度Lx = Xmax-Xmin；
        //计算出Y轴的最大和最小值后，图形在Y轴的高度Hy = Ymax-Ymin；
        //为了程序简单化，以上的计算都是基于DXF中的图形都在第一象限；
        public void DXF_Zoom(PictureBox Picture)    //第二步，缩放dxf图形，能在窗体中心显示，移动的变量为 ZoomFactor和 【MoveCenterX，MoveCenterY】
        {

            if (line_count>0)
            {
                //定义直线的最大和最小X值的数组_LineX
                //X坐标
                ExDXF_X.Add(linePointStartX.Min()); //把直线起点坐标中(StartX)，X轴的最小值放入数组
                ExDXF_X.Add(linePointStartX.Max()); //把直线起点坐标中(StartX)，X轴的最大值放入数组

                ExDXF_X.Add(linePointEndX.Min());  //把直线终点坐标中(EndX)，X轴的最小值放入数组
                ExDXF_X.Add(linePointEndX.Max());  //把直线终点坐标中(EndY)，X轴的最大值放入数组

                //定义直线的最大和最小Y值的数组_LineY
                //Y坐标
                ExDXF_Y.Add(linePointStartY.Min()); //把直线起点坐标中(StartY)，Y轴的最小值放入数组
                ExDXF_Y.Add(linePointStartY.Max()); //把直线起点坐标中(StartY)，Y轴的最大值放入数组

                ExDXF_Y.Add(linePointEndY.Min()); //把直线终点坐标中(EndY)，X轴的最小值放入数组
                ExDXF_Y.Add(linePointEndY.Max()); //把直线终点坐标中(EndY)，X轴的最大值放入数组

            }

            if (circle_count > 0)
            {

                //定义圆的最大和最小X值的数组_CircleX
                int CircleStartX_Min_index = CircleCenterStartX.FindIndex(a => a == CircleCenterStartX.Min()); //查找是否存在叫"CircleCenterStartX.Min()"的人，返回list中的序号
                int CircleStartX_Max_index = CircleCenterStartX.FindIndex(a => a == CircleCenterStartX.Max()); //查找是否存在叫"CircleCenterStartX.Max()"的人，返回list中的序号

                ExDXF_X.Add(CircleCenterStartX.Min() - CircleRadius[CircleStartX_Min_index]); //把圆起点坐标中(StartX-半径长度)，X轴的最小值放入数组；
                ExDXF_X.Add(CircleCenterStartX.Max() + CircleRadius[CircleStartX_Max_index]); //把圆起点坐标中(StartX+半径长度)，Y轴的最大值放入数组

                //定义圆的最大和最小Y值的数组_CircleY
                int CircleStartY_Min_index = CircleCenterStartY.FindIndex(a => a == CircleCenterStartY.Min()); //查找是否存在叫"CircleCenterStartY.Min()"的人，返回list中的序号
                int CircleStartY_Max_index = CircleCenterStartY.FindIndex(a => a == CircleCenterStartY.Max()); //查找是否存在叫"CircleCenterStartY.Max()"的人，返回list中的序号

                ExDXF_Y.Add(CircleCenterStartY.Min() - CircleRadius[CircleStartY_Min_index]); //把圆起点坐标中(StartY-半径长度)，X轴的最小值放入数组
                ExDXF_Y.Add(CircleCenterStartY.Max() + CircleRadius[CircleStartY_Max_index]); //把圆起点坐标中(StartY+半径长度)，Y轴的最大值放入数组

            }

            if (arc_count > 0)
            {
                //定义圆弧的最大和最小X值的数组_ArcX
                int ArcStartX_Min_index = ArcCenterStartX.FindIndex(b => b == ArcCenterStartX.Min()); //查找是否存在叫"ArcCenterStartX.Min()"的人，返回list中的序号
                int ArcStartX_Max_index = ArcCenterStartX.FindIndex(b => b == ArcCenterStartX.Max()); //查找是否存在叫"ArcCenterStartX.Max()"的人，返回list中的序号

                ExDXF_X.Add(ArcCenterStartX.Min() - ArcRadius[ArcStartX_Min_index]); //把圆弧起点坐标中(StartX-半径长度)，X轴的最小值放入数组；
                ExDXF_X.Add(ArcCenterStartX.Max() + ArcRadius[ArcStartX_Max_index]); //把圆弧起点坐标中(StartX+半径长度)，Y轴的最大值放入数组

                //定义圆弧的最大和最小Y值的数组_ArcY
                int ArcStartY_Min_index = ArcCenterStartY.FindIndex(b => b == ArcCenterStartY.Min()); //查找是否存在叫"ArcCenterStartY.Min()"的人，返回list中的序号
                int ArcStartY_Max_index = ArcCenterStartY.FindIndex(b => b == ArcCenterStartY.Max()); //查找是否存在叫"ArcCenterStartY.Max()"的人，返回list中的序号

                ExDXF_Y.Add(ArcCenterStartX.Min() - ArcRadius[ArcStartX_Min_index]); //把圆弧起点坐标中(StartX-半径长度)，X轴的最小值放入数组；
                ExDXF_Y.Add(ArcCenterStartX.Max() + ArcRadius[ArcStartX_Max_index]); //把圆弧起点坐标中(StartX+半径长度)，Y轴的最大值放入数组
                            
            }

            if (lwline_count > 0)
            {
                //定义直线的最大和最小X值的数组_LineX
                //X坐标
                ExDXF_X.Add(LWlinePointStartX.Min()); //把直线起点坐标中(StartX)，X轴的最小值放入数组
                ExDXF_X.Add(LWlinePointStartX.Max()); //把直线起点坐标中(StartX)，X轴的最大值放入数组

                ExDXF_X.Add(LWlinePointEndX.Min());  //把直线终点坐标中(EndX)，X轴的最小值放入数组
                ExDXF_X.Add(LWlinePointEndX.Max());  //把直线终点坐标中(EndY)，X轴的最大值放入数组

                //定义直线的最大和最小Y值的数组_LineY
                //Y坐标
                ExDXF_Y.Add(LWlinePointStartY.Min()); //把直线起点坐标中(StartY)，Y轴的最小值放入数组
                ExDXF_Y.Add(LWlinePointStartY.Max()); //把直线起点坐标中(StartY)，Y轴的最大值放入数组

                ExDXF_Y.Add(LWlinePointEndY.Min()); //把直线终点坐标中(EndY)，X轴的最小值放入数组
                ExDXF_Y.Add(LWlinePointEndY.Max()); //把直线终点坐标中(EndY)，X轴的最大值放入数组

            }


            //计算DXF图形在X方向上的长度
            //计算DXF图形在Y方向上的高度
            float DXF_Width = Math.Abs(ExDXF_X.Max() - ExDXF_X.Min()); //DXF文件在X轴上的长度
            float DXF_Height = Math.Abs(ExDXF_Y.Max() - ExDXF_Y.Min()); //DXF文件在Y轴上的高度


            if (Picture.Width / DXF_Width > Picture.Height / DXF_Height) //比较 长度比【窗体长度/DXF长度】和高度比【窗体宽度/DXF宽度】的比值
            {

                ZoomFactor = ((Picture.Height) / DXF_Height) * 0.95f; //计算窗体高度和图中的图形的高度的比值,EdgeDistX，0.95f为保险系数

                //因平移图形后，使得图形的左下角和窗体的左下角在同一点上，但图形按比例缩放后，图形不在窗体X轴的中心，故设置此变量，用于计算图形距离窗体X轴方向上中心的距离
                //因平移图形后，使得图形的左下角和窗体的左下角在同一点上，但图形按比例缩放后，图形不在窗体Y轴的中心，故设置此变量，用于计算图形距离窗体Y轴方向上中心的距离
                MoveCenterX = Math.Abs(DXF_Width * ZoomFactor - Picture.Width) / 2;
                MoveCenterY = Math.Abs(DXF_Height * ZoomFactor - Picture.Height) / 2;
            }
            else
            {
                ZoomFactor = ((Picture.Width) / DXF_Width) * 0.95f;  //计算窗体宽度和图中的图形的宽度的比值,EdgeDistY，0.95f为保险系数

                MoveCenterX = Math.Abs(DXF_Width * ZoomFactor - Picture.Width) / 2;
                MoveCenterY = Math.Abs(DXF_Height * ZoomFactor - Picture.Height) / 2;

            }
                                                                        
        }


    }

    public class DrawingDxf
    {
        public void Draw(PictureBox Picture,string filename)
        {
            Graphics g = Picture.CreateGraphics();  //创建画布
            //Pen MyPen = new Pen(Color.White, 0);  //定义画笔的颜色和宽度
            g.TranslateTransform(0, Picture.Height); //移动原点
            g.ScaleTransform(1f, -1f);//缩小或放大当前坐标系

            LoadEntities DxfShow = new LoadEntities();//实例化类           
            DxfShow.GetFilename(filename);//调用类中的方法，加载文件路径
            DxfShow.Getline();//调用类中的方法，加载文件中的直线
            DxfShow.GetCircle();//调用类中的方法，加载文件中的圆
            DxfShow.GetArc();//调用类中的方法，加载文件中的圆弧
            DxfShow.GetLWline();//调用类中的方法，加载文件中的多段线


            DxfShow.DXF_Zoom(Picture);//调用类中的方法 ，获取dxf图形的缩放系数
            DxfShow.MoveZero(Picture);//调用类中的方法 ，获取dxf图形移动到原点的坐标

            //以下为获取各个对象的总数量
            int L_count = DxfShow.line_count;//所有直线的总数量  
            int C_count = DxfShow.circle_count;//所有圆的总数量
            int Arc_count = DxfShow.arc_count;//所有圆弧的总数量
            int lwline_count = DxfShow.lwline_count;//所有多段线的总数量


            //以下为dxf图形，能在From窗体中心上显示，而设置的各种参数
            float ZoomFactor = DxfShow.ZoomFactor;//获取DXF图形的缩放系数
            float MoveCenterX = DxfShow.MoveCenterX;//dxf图形缩放后，获取dxf图形距窗体X轴方向上中心的距离
            float MoveCenterY = DxfShow.MoveCenterY;//dxf图形缩放后，获取dxf图形距窗体Y轴方向上中心的距离
            float MoveZeroX = DxfShow.MoveZeroX;//以dxf图形左下角X轴为方向，移动到原点(0,0)
            float MoveZeroY = DxfShow.MoveZeroY;//以dxf图形左下角Y轴为方向，移动到原点(0,0)

            //在窗体中绘出直线
            for (int i = 0; i < L_count; i = i + 1)
            {
                // 在画板上画直线,起始坐标为(X1, Y1),终点坐标为(X2, Y2)
                // ZoomFactor为适合在当前Form上显示的缩放系数
                // MoveZeroX, MoveZeroY为把dxf图形移动到原点(0,0)
                // MoveCenterX为缩放后的dxf图形，距离窗体X轴方向上中心的距离
                // MoveCenterY为缩放后的dxf图形，距离窗体Y轴方向上中心的距离
                Pen MyPen = new Pen(Color.FromArgb(DxfShow.lineColorR[i], DxfShow.lineColorG[i], DxfShow.lineColorB[i]),0);  //定义画笔的颜色和宽度
                g.DrawLine(MyPen, (DxfShow.linePointStartX[i]+ MoveZeroX) * ZoomFactor+ MoveCenterX, (DxfShow.linePointStartY[i]+ MoveZeroY) * ZoomFactor+ MoveCenterY, (DxfShow.linePointEndX[i]+ MoveZeroX) * ZoomFactor+ MoveCenterX, (DxfShow.linePointEndY[i]+ MoveZeroY) * ZoomFactor+ MoveCenterY);

            }

            //在窗体中绘出圆
            for (int j = 0; j < C_count; j = j + 1)
            {
                // 在画板上画圆,起始坐标为(X, Y)
                // ZoomFactor为适合在当前Form上显示的缩放系数
                // MoveZeroX, MoveZeroY为把dxf图形移动到原点(0,0)
                // MoveCenterX为缩放后的dxf图形，距离窗体X轴方向上中心的距离
                // MoveCenterY为缩放后的dxf图形，距离窗体Y轴方向上中心的距离
                Pen MyPen = new Pen(Color.FromArgb(DxfShow.CircleColorR[j], DxfShow.CircleColorG[j], DxfShow.CircleColorB[j]), 0);  //定义画笔的颜色和宽度
                g.DrawEllipse(MyPen, (DxfShow.CircleCenterStartX[j] + MoveZeroX- DxfShow.CircleRadius[j]) * ZoomFactor + MoveCenterX, (DxfShow.CircleCenterStartY[j] + MoveZeroY- DxfShow.CircleRadius[j]) * ZoomFactor +MoveCenterY, DxfShow.CircleRadius[j]*2 * ZoomFactor, DxfShow.CircleRadius[j]*2 * ZoomFactor);
                //g.DrawEllipse(MyPen, 100, 200, 100, 100);
            }

            //在窗体中绘出圆弧
            for (int k = 0; k < Arc_count; k = k + 1)
            {
                // 在画板上画圆弧,起始坐标为(X, Y)
                // MoveZeroX, MoveZeroY为把dxf图形移动到原点(0,0)
                // ZoomFactor为适合在当前Form上显示的缩放系数
                // MoveCenterX为缩放后的dxf图形，距离窗体X轴方向上中心的距离
                // MoveCenterY为缩放后的dxf图形，距离窗体Y轴方向上中心的距离
                // dxf文件定义圆弧：圆心坐标，起始圆弧角度，终点圆弧角度；
                // C# 定义定义圆弧：圆心坐标，起始圆弧角度，整个圆弧的弧度(Deg),故 g.DrawArc(MyPen, CenterX, CenterY, Radius, Radius, ArcStartAngle, Abs(ArcEndAngle - ArcStartAngle))
                Pen MyPen = new Pen(Color.FromArgb(DxfShow.ArcColorR[k], DxfShow.ArcColorG[k], DxfShow.ArcColorB[k]), 0);  //定义画笔的颜色和宽度
                g.DrawArc(MyPen, (DxfShow.ArcCenterStartX[k]+ MoveZeroX- DxfShow.ArcRadius[k])* ZoomFactor + MoveCenterX,(DxfShow.ArcCenterStartY[k]+ MoveZeroY- DxfShow.ArcRadius[k])* ZoomFactor + MoveCenterY,(DxfShow.ArcRadius[k])*2* ZoomFactor,(DxfShow.ArcRadius[k])*2* ZoomFactor,(DxfShow.ArcStartAngle[k]), Math.Abs(DxfShow.ArcEndAngle[k]- DxfShow.ArcStartAngle[k]));
            }

            //在窗体中绘出多段线
            for (int l = 0; l < lwline_count; l = l + 1)
            {
                // 在画板上画直线,起始坐标为(X1, Y1),终点坐标为(X2, Y2)
                // ZoomFactor为适合在当前Form上显示的缩放系数
                // MoveZeroX, MoveZeroY为把dxf图形移动到原点(0,0)
                // MoveCenterX为缩放后的dxf图形，距离窗体X轴方向上中心的距离
                // MoveCenterY为缩放后的dxf图形，距离窗体Y轴方向上中心的距离
                Pen MyPen = new Pen(Color.FromArgb(DxfShow.LWlineColorR[l], DxfShow.LWlineColorG[l], DxfShow.LWlineColorB[l]), DxfShow.LWlineWidth[l] * 3.78f);  //定义画笔的颜色和宽度
                g.DrawLine(MyPen, (DxfShow.LWlinePointStartX[l] + MoveZeroX) * ZoomFactor + MoveCenterX, (DxfShow.LWlinePointStartY[l] + MoveZeroY) * ZoomFactor + MoveCenterY, (DxfShow.LWlinePointEndX[l] + MoveZeroX) * ZoomFactor + MoveCenterX, (DxfShow.LWlinePointEndY[l] + MoveZeroY) * ZoomFactor + MoveCenterY);

            }

            //MessageBox.Show(DxfShow.LWlineWidth[0].ToString());
        }

    }

}


